package com.zzh.partnersys.search.controller;

import com.zzh.partnersys.common.util.TokenUtils;
import com.zzh.partnersys.search.entity.vo.PageResult;
import com.zzh.partnersys.search.entity.vo.TeamSearchVO;
import com.zzh.partnersys.search.entity.vo.UserSearchVO;
import com.zzh.partnersys.search.service.ElasticSearchSearchService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * ES 搜索控制器
 *
 * @author: zzh
 * @date: 2025/11/15 16:34:51
 * @version: 1.0
 */
@Slf4j
@RestController
@RequestMapping("/es")
public class ElasticSearchSearchController {

    @Resource
    private ElasticSearchSearchService esSearchService;

    /**
     * 推荐相似用户（基于当前用户的 tags 和 personalProfile）
     *
     * @param pageNum  页码（从0开始，默认0）
     * @param pageSize 每页大小（默认10）
     * @param request  HttpServletRequest，用于获取当前用户ID
     * @return 推荐用户列表
     */
    @GetMapping("/recommend/users")
    public PageResult<UserSearchVO> recommendUsers(
            @RequestParam(value = "pageNum", defaultValue = "0") Integer pageNum,
            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
            HttpServletRequest request) {
        // 获取当前用户ID
        Long currentUserId = TokenUtils.getCurrentUserIdOrThrow(request);
        
        // 参数校验
        if (pageNum < 0) {
            pageNum = 0;
        }
        if (pageSize <= 0 || pageSize > 100) {
            pageSize = 10;
        }

        return esSearchService.recommendUsers(currentUserId, pageNum, pageSize);
    }

    /**
     * 搜索队伍（基于关键字匹配）
     *
     * @param keyword  搜索关键字（可选）
     * @param pageNum  页码（从0开始，默认0）
     * @param pageSize 每页大小（默认10）
     * @return 队伍列表
     */
    @GetMapping("/search/teams")
    public PageResult<TeamSearchVO> searchTeams(
            @RequestParam(value = "keyword", required = false) String keyword,
            @RequestParam(value = "pageNum", defaultValue = "0") Integer pageNum,
            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
        // 参数校验
        if (pageNum < 0) {
            pageNum = 0;
        }
        if (pageSize <= 0 || pageSize > 100) {
            pageSize = 10;
        }

        return esSearchService.searchTeams(keyword, pageNum, pageSize);
    }
}
